<?php
/**
 * @author Artur Bier <izatop@gmail.com>
 * @package Application
 *
 * @copyright TinyWEB CMS
 * @link http://tinywebcms.ru
 * @link http://cms.vingrad.ru
 * @version SVN: $Id$ 
 */
 
 /**
  * ApplicationController
  */
abstract class ApplicationController extends Object 
{
    /**
     * Event listeners
     *
     * @var listeners
     */
    private static $listeners = array();
    
    /**
     * Configure method. Called after initialize 
     * controller __construct method in Core::ApplicationRunner.
     *
     */
    public function prepare()
    {
    }
    
    /**
     * Get classname of current instance.
     *
     * @return string
     */
    public function getInstanceName()
    {
        return get_class($this);
    }
    
    /**
     * Attach event listener
     *
     * @param Object $object
     * @param array $datasource
     * @return EventHandler
     */
    public static function attachEventListener($object, $datasource = null)
    {
        /**
         * @TODO Add check params
         */
        self::$listeners[] = new ApplicationEventListener(
            (is_array($object) ? $object[0] : $object), 
            (is_array($object) ? $object[1] : 'exec'), 
            ($datasource ? (is_array($datasource) ? $datasource[0] : $datasource) : $_REQUEST),
            (is_array($datasource) ? $datasource[1] : null)
        );
        
        return self::$listeners[count(self::$listeners)-1]; // return descriptor
    }
    
    /**
     * Находит и возвращает все обработчики события или связанные с определенным 
     * экземпляром класса.
     *
     * @param Object $object
     * @return array
     */
    public static function getEventListeners(Object $object = null)
    {
        if($object === null) {
            return self::$listeners;
        }
        
        $listeners = array();
        foreach (self::$listeners as $listener) {
            if($listener->getListener() instanceof $object) {
                $listeners[] = $listener->getListener();
            }
        }
        
        return $listeners;
    }
    
    /**
     * Находит и возвращает обработчик события по экземпляру класса и его методу.
     *
     * @param Object $object
     * @param string $method
     * @return Object
     */
    public static function getEventListener($object, $method)
    {
        foreach (self::$listeners as $listener) {
            if($listener->getListener() instanceof $object && $listener->getMethod() == $method) {
                return $listener->getListener();
            }
        }
        
        return null;
    }
    
    /**
     * Уничтожает обработчик события.
     *
     * @param ApplicationEventListener $event
     */
    public static function dispatchEventListener(ApplicationEventListener $event)
    {
        foreach (self::$listeners as $key => $listener) {
            if($listener instanceof $event) {
                unset(self::$listeners[$key]); // kill link to object
            }
        }
    }
}

/**
 * Tab: 4 spaces
 * Encoding: utf-8
 */
?>